package com.zhoug.common3.pagevalid;

import android.content.Context;
import android.os.Bundle;


import com.zhoug.common3.utils.LogUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author 35574
 * @Date 2021/4/6
 * @Description
 */
public class CallUnitManager {
    private static final String TAG = ">>>CallUnitManager";
    private static final boolean DEBUG = false;

    /**
     * 存储需要执行的任务单元
     */
    private Map<String, CallUnit> mCalls = new HashMap<>();
    /**
     * 单例模式
     */
    private static final CallUnitManager instance = new CallUnitManager();

    private CallUnitManager() {
    }

    public static CallUnitManager getInstance() {
        return instance;
    }

    /**
     * 把执行任务单元加入缓存
     *
     * @param callUnit
     */
    protected void postCallUnit(CallUnit callUnit) {
        mCalls.put(callUnit.getChainId(), callUnit);
    }

    /**
     * 获取指定的执行单元
     *
     * @param chainId
     * @return
     */
    private CallUnit getCallUnit(String chainId) {
        if (chainId != null) {
            if (DEBUG) {
                LogUtils.d(TAG, "getCallUnit:" + chainId);
            }
            if (mCalls.size() > 0) {
                return mCalls.get(chainId);
            }
        }
        return null;
    }

    /**
     * 在验证页面在成功后调用
     * 是否有目标
     * 返回true需要调用{@link #nextValid(String, Context)}
     *
     * @param chainId
     * @return
     */
    public boolean hasTarget(String chainId) {
        return getCallUnit(chainId) != null;
    }

    /**
     * 获取chainId
     * @param bundle
     * @return
     */
    public String getChainId(Bundle bundle){
        if (bundle != null) {
            return bundle.getString(CallUnit.CHAIN_ID);
        }
        return null;
    }

    /**
     * 在验证页面在成功后调用
     *
     * @param chainId CallUnit的唯一标志
     * @param context
     * @return
     */
    public void nextValid(String chainId, Context context) {
        CallUnit callUnit = getCallUnit(chainId);
        if (callUnit != null) {
            callUnit.nextValid(context);
        }
    }

    /**
     * 移除指定chainId的执行单元
     *
     * @param chainId
     */
    public void remove(String chainId) {
        if(chainId!=null){
            if (mCalls.size() > 0) {
                CallUnit remove = mCalls.remove(chainId);
                if (DEBUG && remove != null) {
                    LogUtils.d(TAG, "remove:" + remove);
                }
            }
            if (DEBUG) {
                LogUtils.d(TAG, "mCalls.size:" + mCalls.size());
            }
        }

    }

    /**
     * 终止,取消验证后调用,及时释放内存
     * 可以在验证页面 用户取消验证时调用,如登录页面,用户点击返回按钮
     * @param chainId
     */
    public void cancelValid(String chainId){
        remove(chainId);
    }


}
